﻿using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Collections;
using csNotificaciones;

namespace MotorMetricas.Logica
{
    public class MetricaAtributosEstaticos : AbstractMetrica
    {

        override public int Generar(String ruta)
        {
            ManejoArchivo Manejador = new ManejoArchivo();
            ArrayList misarchivos = null;
            Boolean SinError = true;
            int NumeroAtributosEstaticos = 0;

            if (Manejador.ValidarRuta(ruta))
            {
                misarchivos = Manejador.ObtenerArchivos(ruta);
            }
            else
            {
                SinError = false;
                //Console.WriteLine("ERROR: Ruta invalida");
            }

            if (SinError)
            {
                foreach (String rutaArchivo in misarchivos)
                {
                    
                    int temp = 0;
                    if (Manejador.ValidarArchivo(rutaArchivo))
                    {
                        temp = ContarAtributosEstaticos(rutaArchivo);
                        NumeroAtributosEstaticos = NumeroAtributosEstaticos + temp;
                    }
                }
            }
            Notificacion.mostrarVentana("Metrica de Atributos Estaticos", "La metrica se ha generado con éxito\nResultado: " + NumeroAtributosEstaticos.ToString(), Notificacion.Imagen.Ok, 2);
            return NumeroAtributosEstaticos;
        }


        public int ContarAtributosEstaticos(string rutaArchivo)
        {
            /*
             * Creamos una variable "contador" para llevar la cuenta de los atributos estaticos en el archivo de recorrido actual,
             * hacemos uso de 3 strings llamados "busquedaStatic", "busquedaPuntoComa" y "linea", que serán la palabra "static", el signo
             * punto y coma (;) y la linea que se esta leyendo del archivo actual, respectivamente.
             */
            
            int contador = 0;
            string busquedaStatic = "static";
            string busquedaPuntoComa = ";";
            string linea = null;
            try
            {
                /*
                 * La variable de "archivo" es con la que manejaremos el archivo a parsear, hacemos uso de un while en el que ira leyendo
                 * cada linea de "archivo" hasta el final del propio archivo, cada linea será asignada a "linea" en cada ciclo del while
                 */
                
                StreamReader archivo = new StreamReader(rutaArchivo);

                while ((linea = archivo.ReadLine()) != null)
                {
                    /*
                     * En el siguiente if buscamos la presencia de los strings "busquedaStatic" y "busquedaPuntoComa" en la linea actual
                     * de parseo (designado a "linea"), si se encuentran los 2 strings en "linea" aumentamos el "contador" porque estamos
                     * en presencia de una variable estatica, sino no hacemos nada.
                     */
                    
                    if (( linea.Contains( busquedaStatic ) ) && ( linea.Contains( busquedaPuntoComa )))
                    {
                        contador++;
                    }
                }

                /*
                 * Una vez culminado el conteo cerramos el archivo y manejamos la excepcion que se pueda presentar en todo el metodo
                 */ 

                archivo.Close();
            }
            catch (Exception e)
            {
                Notificacion.mostrarVentana("Metrica de Atributos Estaticos", "Ha ocurrido un error al generar esta metrica", Notificacion.Imagen.Error, 1);
            }

            return contador;
        }

    }
}